#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string>
#include<stdlib.h>
using namespace std;

void handler(int signum)
{
    cout<<"获得了一个信号"<<signum<<endl;
    sleep(1);
}
//这里是硬件方法产生异常
int main()
{
    signal(SIGFPE,handler);
    int a=10;
    a/=0;
    while(true)sleep(1);
    return  0;
}

//这里是软件方法产生信号
// int main()
// {
//     //到达指定的时间以后
//     alarm(3);
//     int count=0;
//     while(true)
//     {
//         //这里执行IO操作本身就很消耗CPU的效率
//         cout<<"count:"<<count++<<endl;
//     }
//     return 0;
// }

//这里是使用系统调用的方法发送信号
// static void usage(string proc)
// {
//     cout<<"Usage /r/n/t"<<proc<<"signumber proc"<<endl;
// }
// //./mysignal 2 pid  这就是利用kill命令将指定的信号发送给指定的进程
// int main(int argc,char* argv[])
// {
//     cout<<"我已经开始运行了"<<endl;
//     sleep(3);
//     abort();
//     //raise(8);
//     // if(argc != 3)
//     // {
//     //     usage(argv[0]);
//     //     exit(0);
//     // }
//     // int signumber=stoi(argv[1]);
//     // int procid=stoi(argv[2]);
//     // kill(signumber,procid);
//     return 0;
// }

/*void catchSig(int signum)
{
    cout<<"进程捕捉到了一个信号，正在处理当中"
    <<signum<<"pid:"<<getpid()<<endl;
}   

int main()
{
    //函数在这里进行回调的时候第一个参数这里的位置会将参数/
    //传递给接下来的回调函数
    //signal(SIGINT,catchSig);//特定信号的处理动作只有一个
    //signal函数仅仅是修改进程对特定信号的后续处理动作
    //产生信号与代码的执行往往是异步的，所以将signal函数写到
    //最前面，这样后续的代码有足够的执行时间，因为我们也不知道
    //信号什么时候能被执行，写在最后的话会影响正常代码的执行
    //signal(SIGQUIT,catchSig);
    // while(true)
    // {
    //     cout<<"我是一个进程我正在运行..."<<"pid:"<<getpid()
    //     <<endl;
    //     sleep(1);

    //     int a=10;
    //     a/=0;
    //     cout<<"run here"<<endl;
    // }
    pid_t id=fork();
    if(id==0)
    {
        int a=10;
        a/=0;
        cout<<"run here"<<endl;
        sleep(1);
        exit(0);
    }
    int status=0;
    int ret=waitpid(-1,&status,0);
    cout<<"父进程"<<getpid()<<"子进程"<<id<<\
    "exit sig:"<<(status & 0x7F)<<" "<<"core is:"<<" "<<(status & 1)<<endl;    
    return 0;
}
*/